/* 
 * File:   Iterador.cpp
 * Author: mauro
 * 
 * Created on 11 de septiembre de 2014, 01:14
 */

#include "Iterador.h"
#include "Nodo.h"
/*constructor*/
// Crea un iterador.
// Pre: la lista fue creada.
// Post: se creó un iterador que apunta hacia la primer
// posición de la lista.

template <class Tipo>
Iterador<Tipo>::Iterador() {
    this->anterior = NULL;
    this->actual = NULL;
    //cout <<"CONSTRUCTOR DEL ITERADOR \n";
}

template <class Tipo>
Iterador<Tipo>::Iterador(Lista<Tipo> * lista) {
    this->anterior = NULL;
    this->actual = lista->getPrimero();
    //cout <<"iterador con dato \n";

}

/*Setear Iterador a una lista*/
template <class Tipo>
void Iterador<Tipo>::setIterador(Lista<Tipo>* lista) {
    this->anterior = NULL;
    this->actual = lista->getPrimero();

}



// El iterador avanza en una posición de la lista. Si la lista no tiene
// elementos o el iterador se encuentra al final de ella, devuelve falso.
// Pre: la lista y el iterador fueron creados.
// Post: el iterador avanzó a la posición siguiente de ser posible.
template <class Tipo>
bool Iterador<Tipo>::avanzar() {
    if (this->actual == NULL) return false;
    this->anterior = this->actual;
    this->actual = this->actual->getSiguiente();
    return true;
}

//Mueve el iterador una cierta cantidad de espacios elegidos.
template <class Tipo>
bool Iterador<Tipo>::moverIterA(int pos) {
    int i = 1;
    while (i <= pos) {
        if (this->actual->getSiguiente() != NULL) {
            this->anterior = this->actual;
            this->actual = this->actual->getSiguiente();
            i++;
        } else {
            return false;
        }
    }
    return true;

}


// Da el valor de la posición donde se encuentra el iterador. Si dicha
// posición está vacía, devuelve NULL.
// Pre: la lista y el iterador fueron creados.
// Post: se devolvió el valor de la posición donde se encuentra el iterador
// o NULL, según corresponda.
template <class Tipo>
Nodo<Tipo>* Iterador<Tipo>::verActual() {
    if (this->alFinal()) return NULL;
    return this->actual;
}

// Devuelve verdadero si el iterador se encuentra al final de la lista,
// falso en caso contrario.
// Pre: la lista y el iterador fueron creados.
template <class Tipo>
bool Iterador<Tipo>::alFinal() {
    return (this->actual == NULL);
}


// Destruye el iterador.
// Pre: el iterador fue creado.
// Post: se destruyó el iterador.
template <class Tipo>
Iterador<Tipo>::~Iterador(){
    printf("Destructor Iterador \n");
}